import * as THREE from "three";
import "./index.css";
import { gsap } from "gsap";

// 导入dat.gui
import * as dat from "dat.gui";

// 轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

// 场景
const scene = new THREE.Scene();

// 相机(透视)
const camera = new THREE.PerspectiveCamera(
  75, // 角度
  window.innerWidth / window.innerHeight,
  0.1, // 近端
  1000 // 远端
);

// 设置相机位置
camera.position.set(0, 0, 10); // xyz

scene.add(camera);

// 添加物体
// 创建几何体
// const box = new THREE.BoxGeometry(1, 1, 1); // 几何体
// const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 基础网格材质
// // 根据几何体和材质创建 => 物体 (将几何体和网格材质放到网格中,拿到最终物体)
// const cube = new THREE.Mesh(box, material);

// 循环创建物体
for (let i = 0; i < 50; i++) {
  // 每一个三角形需要3个顶点,每个顶点包含3个值(xyz)
  const geometry = new THREE.BufferGeometry();
  const positionArr = new Float32Array(9); // 告诉有9个值

  for (let j = 0; j < 9; j++) {
    positionArr[j] = Math.random() * 10 - 5;
  }
  geometry.setAttribute("position", new THREE.BufferAttribute(positionArr, 3));
  // 颜色随机
  const color = new THREE.Color(Math.random(), Math.random(), Math.random());
  const material = new THREE.MeshBasicMaterial({
    color: color,
    transparent: true,
    opacity: Math.random(),
  });
  const cube = new THREE.Mesh(geometry, material);
  // 将物体添加到场景中
  console.log(cube);
  scene.add(cube);
}

// 使用buffer缓存区创建物体
// const geometry = new THREE.BufferGeometry();
// const vertices = new Float32Array([
//   -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0,
//   -1.0, -1.0, 1.0,
// ]);

// 一个顶点包含三个值(xyz)
// geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
// const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 基础网格材质

// const cube = new THREE.Mesh(geometry, material);
// 将物体添加到场景中
// scene.add(cube);
// console.log(cube);

// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 将webgl渲染的canvas添加到body上
document.body.appendChild(renderer.domElement);

// 使用渲染器(通过相机将场景渲染进来)
renderer.render(scene, camera);

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器的阻尼感
controls.enableDamping = true;

// 添加坐标轴
const axeshelp = new THREE.AxesHelper(5); // 线段长度为5
scene.add(axeshelp);

window.addEventListener("dblclick", () => {
  // 双击全屏
  // 全屏时文档上会自动添加fullscreenElement元素
  console.log(document.fullscreenElement);
  if (document.fullscreenElement) {
    document.exitFullscreen(); // 让文档退出全屏
  } else {
    renderer.domElement.requestFullscreen(); // 让画布对象全屏
  }
});

// 通过requestAnimationFrame执行函数时,默认会传入执行的时间
function render(time) {
  controls.update();
  renderer.render(scene, camera);
  // 下一帧再次执行
  requestAnimationFrame(render);
}

// render();
requestAnimationFrame(render);

// 监听画面变化
window.addEventListener("resize", () => {
  // 1.更新摄像头位置
  camera.aspect = window.innerWidth / window.innerHeight;
  // 2.更新摄像机的投影矩阵(参数改变,必须调)
  camera.updateProjectionMatrix();
  // 3.更新渲染的尺寸大小
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 4.设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});
